Prometheus 动态lables标签

prometheus lables

介绍

本篇笔记重点学习Prometheus的relabel_config.也就是标签的管理,包括标签过滤,自定义标签,动态替换标签等.

在Prometheus的官方文档有详细介绍:

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config

一. 标签作用

Prometheus中存储的数据为时间序列,是由Metric的名字和一系列的标签(键值对)唯一标识的, 不同的标签代表不同的时间序列,即 通过指定标签查询指定数据 。

Alertmanager还可以根据标签进行分组,将同一个标签的多个告警通知,打包成一条告警短信发送.

二.Metadata标签

在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容:
address:当前Target实例的访问地址:
scheme:采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS
metrics_path:采集目标服务访问地址的访问路径
一般来说元标签只是Prometheus内部使用,**我们一般不会让其做什么事情,并且这些标签是不会写到数据库当中的,使用promql是查询不到这些标签的.

三.自定义标签

在Prometheus的配置文件里可以定义laebls.添加标签的Key:Value信息.Key是标签名,Value是标签值.在下面的例子中,为某个target定义了2个标签:

1
2
3
4
5
6
7
8
9
- job_name: 'Shanghai Linux Server'
basic_auth:
username: prometheus
password: 123456
static_configs:
- targets: ['192.168.179.99:9100']
labels:
idc: sss
project: blog

修改标签

在下面2个阶段可以对标签进行修改:

  • relabel_configs : 在数据采集之前.在这个阶段可以过滤特定的监控目标(keep,drop),或者过滤某个标签(labelkeep,labeldrop)
  • metric_relabel_configs : 抓取到数据之后.对标签进行重新标记

修改标签的场景:

  • 动态生成新标签(根据已有标签生成新的标签)
  • 过滤target(对匹配某个标签的target进行过滤)
  • 删除不需要标签
  • 添加新标签

标签匹配之后的动作Action:

  • replace : 默认.通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组,分组使用$1,$2…引用(正则匹配,提取字段重新创建新标签,注意这里是创建新的标签
  • keep : 删除regex与连接不匹配的目标 source_labels,让Prometheus丢弃没有匹配到regex的target
  • drop : 删除regex与连接匹配的目标 source_labels,让Prometheus丢弃匹配到regex的target

  • labeldrop : 删除regex匹配的标签,和drop 区别是这里是删除某个标签,而不是删除target

  • labelkeep: 删除regex不匹配的标签,和keep 区别是这里是删除某个标签,而不是删除target

  • labelmap : 匹配regex所有标签名称,并将捕获的内容分组,用第一个分组内容作为新的标签名(使用正则提取出多个字段,使用匹配到的作为新标签名,但是标签的内容不会改变,相对于对原有标签换了个名字,原标签仍然存在)

修改标签场景实战

下面以Prometheus+Consul的自动发现为例,介绍修改标签的实际场景.

服务器通过Consul的API进行注册:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat /tmp/consul.json
{
"ID": "node-exporter-172.26.4.53",
"Name": "node-exporter-172.26.4.53",
"Tags": [
"node-exporter"
],
"Address": "172.26.4.53",
"Port": 9100,
"Meta": {
"app": "nginx",
"project": "abc"

},
"EnableTagOverride": false,
"Check": {
"HTTP": "http://172.26.4.53:9100/metrics",
"Interval": "30s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}

服务注册:

1
curl --request PUT --data @consul-0.json http://172.16.83.201:8500/v1/agent/service/register

下面是Prometheus的配置文件

1
2
3
4
5
6
7
8
9
10
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: '172.16.83.201:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*node-exporter.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap

在Prometheus的UI界面的Service Discovery自动发现可以看到target的label信息

image-20210914172649800

左边是通过consul注册时的meta元标签,在Consul注册时定义的数据都会以__meta_consul_的标签格式展示.而之前提到过, __meta开头的是元数据.只供Prometheus内部使用.

右边的target labels是经过匹配,修改后的标签.而target labels的标签才是我们可以查询或者搜索的,有实际意义的标签.

修改标签场景一: 过滤Target

在Prometheus的配置文件中下面的relabel_configs 定义了一条匹配到

1
2
3
4
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*node-exporter.*
action: keep

我们在Consul注册的时候定义了一个Tag:node-exporter .这个配置表示保留__meta_consul_tags 这个标签的值是”.node-exporter.“ 的target.如果服务器注册Consul时,tags不能匹配到”.node-exporter.那么这个服务器会被Prometheus过滤.即使这个服务器运行了node-exporter

我们还可以通过drop将consul自身的服务器从target里拿掉.

1
2
3
- source_labels: [__meta_consul_service]
regex: 'consul'
action: drop

__meta_consul_service 匹配到consul 值的标签就drop掉.不监控consul服务器

修改标签场景二: 动态新增自定义标签

在通过Consul注册的时候可以携带自定义标签:

1
2
3
4
5
"Meta": {
"app": "nginx",
"project": "abc"

},

这些自定义的标签,在Prometheus里会自动添加下面2个标签:

__meta_consul_service_metadata_app=nginx

__meta_consul_service_metadata_project=abc

但是这些标签是元标签.所以要转换成自定义标签.通过下面的Prometheus配置:

1
2
3
4
5
6
7
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: '172.16.83.201:8500'
services: []
relabel_configs:
- regex: __meta_consul_service_metadata_(.+)
action: labelmap

匹配__meta_consul_service_metadata_(.+)的标签,然后将匹配到的分组(.+) 生成一个新的标签.

也就是__meta_consul_service_metadata_app=nginx 匹配到app=nginx .然后生产一个app=nginx的标签.也就是在Prometheus的UI界面中看到的target labels

labelmap的作用是产生一个新的标签,原来的标签仍然存在.

目前我是利用Ansible的jinjia2模板动态为服务器定义标签,然后在Prometheus中利用labelmap将标签动态生成为自定义标签.

修改标签场景三: 删除某个标签

有些标签不希望被存储上,那么可以使用 labeldrop:删除regex匹配的标签去完成不需要入库 将里面的标签删除掉,在入库之前删除

1
2
3
4
5
6
7
8
9
- job_name: 'Linux Server'
basic_auth:
username: prometheus
password: 123456
static_configs:
- targets: ['192.168.179.99:9100']
relabel_configs:
- action: labeldrop
regex: "job" #正则匹配标签名称

本文标题:Prometheus 动态lables标签

文章作者:Jesse

发布时间:2021年12月09日 - 07:12

最后更新:2021年12月10日 - 22:12

原始链接:https://jesse.top/2021/12/09/prometheus/prometheus labels/

许可协议: 禁止商业用途 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!